#!/usr/bin/env python
# -*-coding: utf-8-*-
# AUTHOR ：Arthur
# DATE   ：2016-10-19
# INTRO  ：
# VERSION：0.1


import spider, config, check_ip, rule


class Update(object):
    @staticmethod
    def get_all_proxies():
        """
        获取所有要处理的ip列表
        :return:
        """
        # cache_peer原有ip列表
        try:
            with open(config.PEER_FILE) as f:
                s = f.read()
            peer_proxies = rule.Rule.peer_data(s)
            # 从大象代理抓来的列表
            #daxiang_proxies = spider.Proxy.get_daxiang_proxies()
            # 从西刺代理抓来的列表
            xici_proxies = spider.Proxy.get_xici_proxies()
            # 所有列表相加
            total_proxies = peer_proxies  + xici_proxies
            # ip去重， 返回清洗列表
            proxies = rule.Rule.data_wash(total_proxies)
            return proxies
        except Exception as e:
            print("失败:",e)

    @staticmethod
    def check():
        """
        主要调用check_ip模块，进行ip质量检测筛选，将检测通过的ip写入config.TEMP_PEER文件
        """
        # 获取去重后的所有列表
        proxies = Update.get_all_proxies()
        print("检测前一共有{}个ip".format(len(proxies)))
        # 检查有效性，检查后会自动更新config.PEER_TEMP文件
        check_ip.CheckTask.start(proxies)

    @staticmethod
    def update_peer():
        """
        将ip和port按照cache_peer的格式写入squid配置文件
        :param ip_port:
        :return:
        """

        # 检测ip,会将检测后的ip写入config.PEER_TEMP_FILE
        Update.check()

        # 将缓存文件中的ip读取出来
        with open(config.PEER_TEMP_FILE, "r") as f:
            s = f.read().strip()
            ip_list = s.split("\n")
        print("检测后共{}个可用ip".format(len(ip_list)))
        # 将检测后的ip存入config.PEER_FILE
        peers = []
        for ip_port in ip_list:
            ip = ip_port.split(":")[0]
            port = ip_port.split(":")[1]
            # 将上面读取的ip:port的格式转化为cache_peers格式
            peer = 'cache_peer {}  parent {} 0 proxy-only round-robin'.format(ip, port)
            peers.append(peer)
        # 一次性写入squid配置文件
        with open(config.PEER_FILE, "w") as f:
            print("\n".join(peers), file=f)
